/*
 * 技能类
 * 使用 origin 保存拥有者， turn 保存计算回合名。
 * 须先调用 canUse 返回该技能是否有效（主动技能为是否能主动使用，被动技能为是否能触发）。
 * 注意：canUse 的实现要么 return false，要么 return 调用父类的 canUse
 * 使用时触发 use ，返回使用是否成功。须先递归调用父类的 use ，若不成功则退出。
 * 获得和失去技能时触发 onLearn 和 onUnlearn 。
 * 
 * plainRange 表示技能在通常情况下的使用范围（射程，光环半径等）
 * getRange 函数应返回实际的范围（射程加成buff？）
 * 默认返回 plainRange ，欧几里得距离【的平方】≤ getRange 为可使用
 * 0表示范围很小（永不能使用）？ -1表示无意义（不是一个范围技能） 用大数表示无限距离
 */
#ifndef SKILL_H
#define SKILL_H

#include <vector>
#include <string>
#include "sdk/const.h"
#include "prefixobject.h"

class Entity;
class Game;

class Skill: public PrefixObject{
private:
public:
	Entity *origin;
    TurnName turn;
	int plainRange, plainDamage;
    explicit Skill(): PrefixObject(), origin(nullptr){
		this->setName("Skill");
		this->plainRange = -1;
		this->plainDamage = 0;
	}
    virtual ~Skill(){}
	virtual int range();
	virtual int damage(){return this->plainDamage;}
    virtual bool onLearn(Game *g) {return true;}
	virtual bool onUnlearn(){return true;}
	virtual bool canUse(Game *g, const std::vector<std::string> &params){return true;}
    virtual bool use(Game *g, const std::vector<std::string> &params);
	virtual Json::Value toJson() override;
	// return true on success
};

/**
 * 带有冷却时间的技能类
 * cd 表示冷却时间， cd_timer 为冷却时间计数器。
 */
class CoolDownSkill: public Skill{
public:
    int cd_timer;
    int cd;
    explicit CoolDownSkill(): Skill() {
		this->setName("CoolDownSkill");
		cd_timer = 0;
		cd = 0;
	}
    virtual ~CoolDownSkill(){}
	virtual bool onDescendCoolDown();
    virtual bool canUse(Game *g, const std::vector<std::string> &params) override;
    virtual bool use(Game *g, const std::vector<std::string> &params) override;
	virtual Json::Value toJson() override;
};


#endif /* end of include guard: SKILL_H */
